package com.admin_system.config;

import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 全局跨域过滤器
 * 用于解决浏览器同源策略限制，允许来自不同源的请求访问资源
 * 优先级设为最高，确保在Spring Security过滤器链之前执行
 * 这对前后端分离的架构至关重要，使前端能够安全地调用后端API
 */
@Component
@Order(Ordered.HIGHEST_PRECEDENCE)  // 设置最高优先级，确保在其他过滤器之前处理跨域
public class CorsFilter implements Filter {

    /**
     * 过滤器实现方法
     * 拦截所有HTTP请求，添加必要的CORS响应头
     * 允许跨域请求并对OPTIONS预检请求作特殊处理
     * 
     * @param req Servlet请求
     * @param res Servlet响应
     * @param chain 过滤器链
     * @throws IOException 如果发生I/O错误
     * @throws ServletException 如果发生Servlet错误
     */
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) res;
        HttpServletRequest request = (HttpServletRequest) req;
        
        // 允许所有来源的跨域请求，生产环境中应该限制为特定域名
        response.setHeader("Access-Control-Allow-Origin", "*");
        
        // 允许的HTTP方法
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT");
        
        // 预检请求的缓存时间（秒）
        response.setHeader("Access-Control-Max-Age", "3600");
        
        // 允许的请求头
        response.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization, Content-Length, X-Requested-With");
        
        // 对OPTIONS预检请求直接返回200状态码，无需进一步处理
        // OPTIONS请求是浏览器在发送实际跨域请求前的预检机制
        if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
            response.setStatus(HttpServletResponse.SC_OK);
        } else {
            // 非OPTIONS请求继续过滤器链
            chain.doFilter(req, res);
        }
    }
} 